package mybox.engine.servo;

import java.io.IOException;

import mybox.engine.Circle;
import mybox.engine.File4Qcad;
import mybox.engine.QVector;
import mybox.engine.Schachtel;

public class ServoAndBox   {
	
	public static final String  versionNo="2.0";
	public static final String S3111 ="Conrad S3111";
	File4Qcad file4qcad ;		
	QVector lowerLeftHole;
	QVector upperLeftHole;
	QVector upperRightHole;
	QVector lowerRightHole;
	QVector center;
	
	//BoxParameter
	double materialDicke=4;	
	double zinkungsFaktor=1;
	double laserBreite=0.03;
	
	double boxLaenge;
	double boxBreite;
	double boxHoehe;
	
	double gegenBoxLaenge;
	double gegenBoxBreite;
	double gegenBoxHoehe;
	double gegenBoxExtension;
	
	/**    langSeiteLochDistance
	 * O<----------------->O
	 * ^                   ^
	 * |       center      |kurzSeiteLochDistance
	 * |                   |
	 * O<----------------->O
	 * Masse mit Schiebelehre beim Servo abnehmen!
	 * */
	
	double langSeiteLochDistance;
	double kurzSeiteLochDistance;
	double lochRadius;
	
	double korpusLaenge;
	double korpusLaengeOhneNase;
	double korpusBreite;
	QVector lowerLeftEcke;
	
	ServoRudder rudder;
	/*
	double rudder1Dist2m0;
	double rudder2Dist2m0;
	double rudder3Dist2m0;
	double rudder4Dist2m0;
	*/
	
	/*
	double rudderBefestLochDm;
	double rudderBefestLochRadius;
	
	double rudderLength; //Länge des Ruders
	
	double m0;  //Innendurchmesser des Setzkreises
	double mm0; //Aussendurchmesser des Setzkreises
	double s0;  //Kopfdurchmesser der Befestigungsschraube
	*/ 
	
	double rudderZyl2Back;
	double rudderZyl0;
	
	QVector rudderCenter;
	QVector gegenAchseCenter;
	double  gegenAchseRadius;
	double diagFromRudderCenter;
	double diagSpace;
	
	Schachtel servoBox;
	QVector drawPos;
	QVector korpusOffset;
	
	Schachtel gegenBox;
	
	double servoProtruding; //soviel wie der Servo rausschaut, nach Montage (mit Rudder)
	
	QVector gegenBoxPos;
	
	QVector gegenBoxGegenAchse;	
	Circle gegenAufhaengung;

	
	public ServoAndBox(File4Qcad file4qcad, QVector aktPos, String type) throws SecurityException, IOException {
		this.drawPos=new QVector(aktPos);
		this.lowerLeftHole=new QVector(aktPos);
		this.file4qcad=file4qcad;
		if (type.equalsIgnoreCase(S3111)) {
			
			langSeiteLochDistance=43.5;
			kurzSeiteLochDistance=5.75;
			lochRadius=2;      //Servo-Befestigungsloecher am Korpus
			korpusLaenge=41.6; //inklusive DrahtanschlussNase
			
			//Zum rudderCenter Testen:
			//korpusLaenge=40; 
			
			korpusLaengeOhneNase=40; //inklusive DrahtanschlussNase
			korpusBreite=20;
			
			rudder = new ServoRudder(file4qcad, type, laserBreite);
			/*
			//Abstände der rudderBefestigungslöcher zum InnenSetzkreis-Rand
			rudder1Dist2m0=9.0; 
			rudder2Dist2m0=8.55;
			rudder3Dist2m0=9.0;
			rudder4Dist2m0=8.55;
			*/
			/** Abhängig von der Größe der Befestigungschrauben
			muss bei Rudder mit entsprechendem Bohrer (hier 2mm) 
			aufgebohrt werden */
			//rudderBefestLochDm=2;
			
			//rudderBefestLochRadius=rudderBefestLochDm/2;
			
			
			//RudderInnenkreisdurchmesser
			//m0=6.05;
			//RudderAussenkreisdurchmesser
			//mm0=7.45;
			//Kopfdurchmesser der Befestigungsschraube
			//s0=5;
			
			//rudderLength=12.0+m0/2; //Die 13.55 werden vom Innenkreis gemessen
			
			
			rudderZyl2Back=27.6;
			rudderZyl0=5.65;	
			
			
			boxLaenge=65+2*materialDicke;
			boxBreite=35+2*materialDicke;
			boxHoehe=40+2*materialDicke;
			
			korpusOffset = new QVector(12.75,16.625);
			
			servoProtruding=16.7;
			
			/**Diese Hoehe muss zusammenstimmen mit der Hoehe 
			 * des Servoboxgehaueses, damit oben und unten
			 * die jeweiligen Drehachsen montiert werden können.*/
			gegenBoxHoehe=boxHoehe+servoProtruding+(3*materialDicke);
			gegenBoxBreite=boxHoehe;
			gegenBoxLaenge=boxLaenge;
			
			
			
		}
		servoBox = new Schachtel(file4qcad,drawPos, boxLaenge,boxBreite,boxHoehe,materialDicke,zinkungsFaktor,laserBreite);
			
		lowerLeftHole = drawPos.vecAdd(korpusOffset);
		upperLeftHole = new QVector(lowerLeftHole.x, lowerLeftHole.y+kurzSeiteLochDistance+2*lochRadius);
		upperRightHole = new QVector(upperLeftHole.x+langSeiteLochDistance+2*lochRadius, upperLeftHole.y);
		lowerRightHole = new QVector(lowerLeftHole.x+langSeiteLochDistance+2*lochRadius, lowerLeftHole.y);
		center = new QVector((lowerLeftHole.x+lowerRightHole.x)/2,
	                         (lowerLeftHole.y+upperLeftHole.y)/2
	                        );
		
		lowerLeftEcke = new QVector(center.x-korpusLaengeOhneNase/2,center.y-(korpusBreite/2));
    	  
		rudderCenter = new QVector(lowerLeftEcke.x+rudderZyl2Back+(rudderZyl0/2),lowerLeftEcke.y+(korpusBreite/2));
		
		QVector rC2servoBox = new QVector(rudderCenter.x-servoBox.grundPlatte1.ecke[0].x,
				                          rudderCenter.y-servoBox.grundPlatte1.ecke[0].y);
		double rudderCenter2Front=servoBox.grundPlatte1.ecke[1].x-rudderCenter.x;
		double halbeGrundPlatte=(servoBox.grundPlatte1.ecke[3].y-servoBox.grundPlatte1.ecke[0].y)/2;
			
		diagFromRudderCenter=java.lang.Math.sqrt(rudderCenter2Front*rudderCenter2Front+halbeGrundPlatte*halbeGrundPlatte);
				
		
		
		gegenAchseCenter = new QVector(
				servoBox.grundPlatte2.ecke[0].x+rC2servoBox.x,
				servoBox.grundPlatte2.ecke[0].y+rC2servoBox.y
				);
		
		gegenAchseRadius=2.45-2*laserBreite; 
		diagSpace=gegenAchseRadius;
		
		gegenBoxExtension=gegenAchseRadius+diagFromRudderCenter+rudder.length;
		
        gegenBoxPos = new QVector(0,-(boxHoehe+boxBreite+3*materialDicke));
    	
    	gegenBox = new Schachtel(file4qcad,gegenBoxPos, gegenBoxLaenge,gegenBoxBreite,gegenBoxHoehe,gegenBoxExtension,materialDicke,laserBreite);
    	gegenBoxGegenAchse = 
    		     new QVector(
    		    		 gegenBox.grundPlatte1.ecke[1].x+
    		    		 diagSpace+diagFromRudderCenter,    		    		 
    		    		 gegenBox.grundPlatte1.ecke[1].y+gegenBox.grundPlatte1.breite/2);
    	gegenAufhaengung = new Circle(file4qcad,gegenBoxGegenAchse,gegenAchseRadius);
 
		
	}
	
	public void drawBox() throws SecurityException, IOException {		
		servoBox.draw();
	}
	
	
	public void drawJamaica() {
		servoBox.drawServoJamaica();
	}
	
	public void drawGegenJamaica() {
		gegenBox.drawServoJamaica();
	}
	
    public void drawKorpus() {
    	
    	new Circle(file4qcad, lowerLeftHole, lochRadius).draw();  
    	new Circle(file4qcad, upperLeftHole, lochRadius).draw();
    	new Circle(file4qcad, upperRightHole, lochRadius).draw();
    	new Circle(file4qcad, lowerRightHole, lochRadius).draw();
    	
    	
    	QVector lowerLeftRectPos = new QVector(center.x-korpusLaenge/2, center.y-korpusBreite/2);
    	QVector upperLeftRectPos = new QVector(center.x-korpusLaenge/2, center.y+korpusBreite/2);
    	QVector lowerRighthtRectPos = new QVector(center.x+korpusLaenge/2, center.y-korpusBreite/2);
    	
    	QVector vertikale = new QVector(0,korpusBreite);
    	QVector horizontale = new QVector(korpusLaenge,0);
    	
    	file4qcad.println(vertikale.printLineAktPosNeutral(lowerLeftRectPos));
    	file4qcad.println(horizontale.printLineAktPosNeutral(lowerLeftRectPos));
    	file4qcad.println(horizontale.printLineAktPosNeutral(upperLeftRectPos));
    	file4qcad.println(vertikale.printLineAktPosNeutral(lowerRighthtRectPos));
    	    	  	
    	
    }
    
    public void drawRudderHoleAtBox() {
    	new Circle(file4qcad,rudderCenter,rudder.mm0/2).draw();    	
    }
    
    public void drawGegenAchse() {
    	new Circle(file4qcad,gegenAchseCenter,gegenAchseRadius).draw();
    }
    
    public void drawGegenBox() throws SecurityException, IOException {
    	    	
		gegenBox.draw();
		gegenAufhaengung.draw();
    }
    
    public void drawRudder() {
    	
    	QVector gegenBoxAchse = 
		     new QVector(
		    		 gegenBox.grundPlatte2.ecke[1].x+
		    		 diagSpace+diagFromRudderCenter,    		    		 
		    		 gegenBox.grundPlatte2.ecke[1].y+gegenBox.grundPlatte2.breite/2);
    	
    	new Circle(file4qcad,gegenBoxAchse,rudder.mm0/2).draw();
    	//Zum Nachmessen im CAD-File
    	new Circle(file4qcad,gegenBoxAchse,rudder.m0/2).draw();
    	  
		//RudderInnenkreisdurchmesser
		//m0=6.05;
    	    		
    	new Circle(file4qcad, new QVector(gegenBoxAchse.x+(rudder.dist2m0[0]+rudder.m0/2+rudder.befestLochRadius),gegenBoxAchse.y),rudder.befestLochRadius).draw();
    	new Circle(file4qcad, new QVector(gegenBoxAchse.x-(rudder.dist2m0[2]+rudder.m0/2+rudder.befestLochRadius),gegenBoxAchse.y),rudder.befestLochRadius).draw();
    	
    	new Circle(file4qcad, new QVector(gegenBoxAchse.x,gegenBoxAchse.y+(rudder.dist2m0[1]+rudder.m0/2+rudder.befestLochRadius)),rudder.befestLochRadius).draw();
    	new Circle(file4qcad, new QVector(gegenBoxAchse.x,gegenBoxAchse.y-(rudder.dist2m0[3]+rudder.m0/2+rudder.befestLochRadius)),rudder.befestLochRadius).draw(); 
    	
    	
    	
    }
    
	

}
